package email

import (
	"awesomeProject1/push/plugin"
	"crypto/tls"
	"gopkg.in/gomail.v2"
	"log"
)

// EmailService 是电子邮件推送服务的实现
type EmailService struct {
	smtpServer string // SMTP 服务器地址
	smtpPort   int    // SMTP 服务器端口
	username   string // SMTP 登录用户名
	password   string // SMTP 登录密码
}

// NewEmailService 创建一个新的 EmailService 实例
func NewEmailService(smtpServer string, smtpPort int, username, password string) *EmailService {
	return &EmailService{
		smtpServer: smtpServer,
		smtpPort:   smtpPort,
		username:   username,
		password:   password,
	}
}

// SendEmail 发送电子邮件
func (es *EmailService) SendEmail(info plugin.MessageInfo) error {

	log.Println("=======================>进入邮件插件发送消息")
	d := gomail.NewDialer(
		es.smtpServer,
		es.smtpPort,
		es.username,
		es.password)
	log.Println("=======================>邮件插件配置", d)

	// 关闭SSL协议认证
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

	m := gomail.NewMessage()
	m.SetHeader("From", es.username) //发件人 邮箱账号为发件人
	m.SetHeader("Subject", "综合执法")
	m.SetBody("text/plain", info.Message)

	// 批量发送邮件
	for i := 0; i < len(info.Receiver); i++ {
		m.SetHeader("To", info.Receiver[i])
		log.Println("=======================>发送账号", es.username)
		log.Println("=======================>对方账号", info.Receiver[i])
		log.Println("=======================>邮件信息", m)
		if err := d.DialAndSend(m); err != nil {
			log.Println("===================>发生错误", err)
			continue //批量发送，其中某一条出现错误，不退出发送程序，继续发送后面的信息，可以记录错误信息
		}
	}

	return nil
}
